3. Taratura Dinamica tramite Regressione non lineare

taratura
regressione
Autore/Autrice

Mariolino De Cecco e Paolo Bosetti

Data di Pubblicazione

15 maggio 2025

Sommario

Esempio per la taratura dinamica di un sensore PT100 mediante regressione lneare e non-lineare ai minimi quadrati.

Attenzione: 1. Scriviamo dplyr::filter(i>80) anziché semplicemente filter(i>80) in quanto la funzione si trova in due pacchetti con finalità diverse

1 Taratura dinamica

Consideriamo il caso di una sonda PT100 a temperatura \(T_i\) immersa repentinamente in un mezzo termostatato a temperatura \(T_f\). Questa azione la possiamo modellare come un ingresso ideale a gradino in quanto la dinamica termica, essenso lenta, è praticamente insensibile al lasso di tempo in cui si inserisce la sonda nel mezzo. Sotto queste ipotesi la temperatura della sonda raggiunge quella del mezzo secondo la legge:

\[ T(t) = (T_i - T_f)e^{-\frac{t}{\tau}} + T_f \tag{1}\]

Leggiamo un file di taratura acquisito in laboratorio consistente nei dati ottenuti inserendo una PT100 in un fornelletto termostatato, simulando quindi l’ingresso a gradino appena modellato matematicamente.

# Leggiamo il file assumendo che sia separato da tabulazioni (\t)
dati <- read.table("0_Dati/gio_1_3_n1bis.txt", header=FALSE, sep="\t", dec=",", stringsAsFactors=FALSE)
colnames(dati) <- c("Tempo", "Temp", "Temp_f")
dati[] <- lapply(dati, function(x) as.numeric(gsub(",", ".", x)))

s <- tibble(
  t = dati[,1],
  Temp = dati[,2]
)

# Grafici
pp <- plot_ly(s) %>%  # 's' è il dataframe
  add_lines(x = ~t, y = ~Temp, name = "Temperatura", line = list(color = "red")) %>%
  layout(
    title = "Grafico Temperatura vs Tempo",
    xaxis = list(title = "Tempo (s)"),
    yaxis = list(title = "Temperatura (°C)")
  )
pp
Con GGPlot2
(s %>% 
  ggplot(aes(x=t, y=Temp)) +
  geom_line() +
   labs(x="Tempo (s)", y="Temperatura (°C)")) %>% 
  ggplotly()

1.1 Secondo metodo: linearizzazione

La Equazione 1 può essere resa lineare nei coefficienti così:

\[ \begin{align} \frac{T(t) -T_f}{T_i - T_f} &= e^{-\frac{t}{\tau}} \\ \ln\left(\frac{T(t) -T_f}{T_i - T_f}\right) &= \ln(e^{-\frac{t}{\tau}}) \\ \ln\left(\frac{T(t) -T_f}{T_i - T_f}\right) &= -\frac{t}{\tau} \end{align} \]

Per ottenere tale andamento lineare possiamo quindi riorganizzare i dati come segue ed eseguire un fitting lineare con la funzione lm():

# Definizione dei valori iniziali e finali
Ti <- 33
Tf <- 95
ti <- 46

# Selezione e trasformazione dei dati
si <- s %>% 
  select(t, Temp) %>% 
  mutate(t = t - ti) %>%
  dplyr::filter(t > 0 ) %>%
  mutate(y = log((Temp-Tf)/(Ti - Tf))) %>% 
  dplyr::filter(!is.nan(y))
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `y = log((Temp - Tf)/(Ti - Tf))`.
Caused by warning in `log()`:
! NaNs produced
# Fitting Lineare
si.lm <- si %>% 
  dplyr::filter(t< 70) %>%
  lm(y~t, data=.) 
si.lm %>% summary()

Call:
lm(formula = y ~ t, data = .)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.11338 -0.01097 -0.00022  0.01401  0.07064 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  5.262e-02  3.071e-03   17.14   <2e-16 ***
t           -2.928e-02  7.605e-05 -384.98   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.02558 on 277 degrees of freedom
Multiple R-squared:  0.9981,    Adjusted R-squared:  0.9981 
F-statistic: 1.482e+05 on 1 and 277 DF,  p-value: < 2.2e-16
gain = si.lm$coefficients[2]
tau <- round(-1/gain, 1)
cat(paste("tau:", tau))
tau: 34.2
# Grafici
pp <- plot_ly(si) %>% 
  add_lines(x = ~t, y = ~y, name = "Andamento stimato", line = list(color = "red")) %>%
  add_lines(x = ~t, y = ~gain*t, name = "Log Temperatura", line = list(color = "blue")) %>%
  layout(
    title = "Grafico Linearizzato Temperatura vs Tempo",
    xaxis = list(title = "Tempo [s]"),
    yaxis = list(title = "Temperatura Linearizzata [°C]")
  )
pp
Con GGPlot2
library(modelr)

Attaching package: 'modelr'
The following object is masked from 'package:gsignal':

    resample
pp <- si %>% 
  add_predictions(si.lm) %>% 
  select(t, y, pred) %>% 
  pivot_longer(-t) %>% 
  ggplot(aes(x=t, y=value, color=name)) +
  geom_line() +
  labs(x="Tempo (s)", y="Temperatura (°C)")
ggplotly(pp)

1.2 Terzo metodo: regressione non-lineare

Con il terzo metodo si usa la regressione non-lineare ai minimi quadrati per ottenere \(\tau\) o direttamente tutti i possibili parametri incogniti \(T_i, T_f, \tau, t_i\). Solitamente però la sonda PT100 costituia da filo di Platino avvolto a spirale è protetta da una guaina metallica che assorbe e scambia calore con il sensore e con l’ambiente di cui ha il compito di misurare la temperatura. Il modello più realistico è leggermente più complicato.

Figura: Modello 2° ord di una PT100

Con \(\alpha\) ed A sono indicati il coefficiente di conduzione e l’area di contatto tra guaina e sonda e tra misurando e guaina, la massa m ed il calore specifico c della sonda e della guaina sono indicati rispettivamente con i pedici S e G.

In questo caso il modello è del secondo ordine e la funzione di trasferimento tra la trasformata del misurando \(T_M(\omega)\) e la trasformata dell’uscita \(T_{S}(\omega\) diviene:

\[ \frac{T_{S}(\omega)}{T_M(\omega)} = \frac{1}{\tau_1 \tau_2 i\omega^{2} + (\tau_1 + \tau_2)i\omega + 1} \]

Un sistema termico è generalmente sovrasmorzato per cui le radici dell’equazione caratteristica sono reali e distinte. Definendo le costanti di tempo come \(\tau_1\) > \(\tau_2\), la risposta per una variazione a gradino da \(T_i\) a \(T_f\) seguirà l’andamento temporale:

\[ T(t) = T_f + (T_i - T_f) * (\frac{\tau_1}{\tau_1 - \tau_2} e^{-t/\tau_1} - \frac{\tau_2}{\tau_1 - \tau_2} e^{-t/\tau_2}) \]

Esercitazione

Riconoscimento punti esame

Il completamento di questo esercizio comporta il riconoscmiento di ±0.5 punti.

Assegnazioni

Elenco assegnazioni

  • A partire dal modello del sistema con guaina mostrato in figura,
    mostrare i passaggi necessari per ottenere la funzione di trasferimento
    e la risposta al gradino

  • Impiegando i dati forniti, eseguire la regressione non lineare in cui i
    parametri incogniti sono solo \(\tau_1\) e \(\tau_2\)

  • Impiegando i dati forniti, eseguire la regressione non lineare in cui i
    parametri incogniti sono \(T_i, T_f, \tau_1, \tau_2, t_i\)

  • Mediante il metodo bootstrap, ottenere gli intervalli di confidenza sui
    parametri

Suggerimenti